package com.gin.web.session;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.ConcurrentHashMap;

/**
 * session 池子，保存登录用户的 session
 */
public class SessionPool {

    private static Logger LGR = LoggerFactory.getLogger(SessionPool.class);

    /**
     * 保存登录session 的集合
     */
    private static ConcurrentHashMap<String, HttpSession> SESSIONS = new ConcurrentHashMap<>(50);

    /**
     * 获取 session
     * 如果没有就创建一个session
     *
     * @param token 用户标识
     * @return
     */
    public static HttpSession getSession(String token) {
        HttpSession session = null;
        // 如果有 session  说明没有过期
        if (SESSIONS.containsKey(token)) {
            session = SESSIONS.get(token);
            // 最后一次活动时间，则修改当前时间为最后活动时间
            session.setLastActivityTime(System.currentTimeMillis());
            LGR.debug("获取session = [{}]", session);
        } else {
            session = new HttpSession(token);
            // 最后一次活动时间，则修改当前时间为最后活动时间
            session.setLastActivityTime(System.currentTimeMillis());
            // 添加到，session 池子里
            SESSIONS.put(token, session);
            LGR.debug("创建 session = [{}]", session);
        }
        return session;
    }

    /**
     * session，池子里是否有 ， 平台用户 session
     *
     * @param token 用户标识
     * @param url   地址
     * @return
     */
    public static boolean hasSession(String token, String url) {
        boolean flag = SESSIONS.containsKey(token);
        if (flag) {
            HttpSession session = SESSIONS.get(token);
            // 最后一次活动时间，则修改当前时间为最后活动时间
            session.setLastActivityTime(System.currentTimeMillis());
            return true;
        }
        return false;
    }

    /**
     * 清理掉，过期的session
     *
     * @param millis 过期时间 毫秒数
     */
    public static void clearOverdueSession(long millis) {
        for (HttpSession session : SESSIONS.values()) {
            // 如果，当前时间 - 最后活动时间，>=  过期时间，则删除session，表示session过期
            if ((System.currentTimeMillis() - session.getLastActivityTime()) >= millis) {
                SESSIONS.remove(session.getToken());
                LGR.debug("session = [{}] . 已过期。", session);
            }
        }
    }

    /**
     * 清理session
     *
     * @param token
     * @return
     */
    public static boolean clearSession(String token) {
        if (SESSIONS.containsKey(token)) {
            SESSIONS.remove(token);
            LGR.debug("清理session = [{}]", token);
            return true;
        }
        return false;
    }
}
